<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head><!-- start favicons snippet, use https://realfavicongenerator.net/ --><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="manifest" href="/assets/site.webmanifest"><link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#fc4d50"><link rel="shortcut icon" href="/assets/favicon.ico"><meta name="msapplication-TileColor" content="#ffc40d"><meta name="msapplication-config" content="/assets/browserconfig.xml"><meta name="theme-color" content="#ffffff"><!-- end favicons snippet -->
<title>ExoPlayerTestRunner (ExoPlayer library)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.5.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
    try {
        if (location.href.indexOf('is-external=true') == -1) {
            parent.document.title="ExoPlayerTestRunner (ExoPlayer library)";
        }
    }
    catch(err) {
    }
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = false;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!--   -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!--   -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
  allClassesLink = document.getElementById("allclasses_navbar_top");
  if(window==top) {
    allClassesLink.style.display = "block";
  }
  else {
    allClassesLink.style.display = "none";
  }
  //-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!--   -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">com.google.android.exoplayer2.testutil</a></div>
<h2 title="Class ExoPlayerTestRunner" class="title">Class ExoPlayerTestRunner</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li><a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>com.google.android.exoplayer2.testutil.ExoPlayerTestRunner</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd><code><a href="../audio/AudioListener.html" title="interface in com.google.android.exoplayer2.audio">AudioListener</a></code>, <code><a href="../device/DeviceListener.html" title="interface in com.google.android.exoplayer2.device">DeviceListener</a></code>, <code><a href="../metadata/MetadataOutput.html" title="interface in com.google.android.exoplayer2.metadata">MetadataOutput</a></code>, <code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code>, <code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code>, <code><a href="ActionSchedule.Callback.html" title="interface in com.google.android.exoplayer2.testutil">ActionSchedule.Callback</a></code>, <code><a href="../text/TextOutput.html" title="interface in com.google.android.exoplayer2.text">TextOutput</a></code>, <code><a href="../video/VideoListener.html" title="interface in com.google.android.exoplayer2.video">VideoListener</a></code></dd>
</dl>
<hr>
<pre>public final class <span class="typeNameLabel">ExoPlayerTestRunner</span>
extends <a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">Object</a>
implements <a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a>, <a href="ActionSchedule.Callback.html" title="interface in com.google.android.exoplayer2.testutil">ActionSchedule.Callback</a></pre>
<div class="block">Helper class to run an ExoPlayer test.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="nested.class.summary">
<!--   -->
</a>
<h3>Nested Class Summary</h3>
<table class="memberSummary">
<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="ExoPlayerTestRunner.Builder.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner.Builder</a></span></code></th>
<td class="colLast">
<div class="block">Builder to set-up a <a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil"><code>ExoPlayerTestRunner</code></a>.</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- =========== FIELD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="field.summary">
<!--   -->
</a>
<h3>Field Summary</h3>
<table class="memberSummary">
<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Field</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static <a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#AUDIO_FORMAT">AUDIO_FORMAT</a></span></code></th>
<td class="colLast">
<div class="block">A generic audio <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> which can be used to set up a <a href="FakeMediaSource.html" title="class in com.google.android.exoplayer2.testutil"><code>FakeMediaSource</code></a>.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>static <a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#VIDEO_FORMAT">VIDEO_FORMAT</a></span></code></th>
<td class="colLast">
<div class="block">A generic video <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> which can be used to set up a <a href="FakeMediaSource.html" title="class in com.google.android.exoplayer2.testutil"><code>FakeMediaSource</code></a>.</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!--   -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)">assertMediaItemsTransitionedSame</a></span>&#8203;(<a href="../MediaItem.html" title="class in com.google.android.exoplayer2">MediaItem</a>...&nbsp;mediaItems)</code></th>
<td class="colLast">
<div class="block">Asserts that the media items reported by <a href="../Player.Listener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"><code>Player.Listener.onMediaItemTransition(MediaItem, int)</code></a> are the same as the provided media
 items.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)">assertMediaItemsTransitionReasonsEqual</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;reasons)</code></th>
<td class="colLast">
<div class="block">Asserts that the media item transition reasons reported by <a href="../Player.Listener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"><code>Player.Listener.onMediaItemTransition(MediaItem, int)</code></a> are the same as the provided reasons.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertNoPositionDiscontinuities()">assertNoPositionDiscontinuities</a></span>()</code></th>
<td class="colLast">
<div class="block">Asserts that <a href="../Player.Listener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"><code>Player.Listener.onPositionDiscontinuity(Player.PositionInfo,
 Player.PositionInfo, int)</code></a> was not called.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertPlaybackStatesEqual(java.lang.Integer...)">assertPlaybackStatesEqual</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;states)</code></th>
<td class="colLast">
<div class="block">Asserts that the playback states reported by <a href="../Player.Listener.html#onPlaybackStateChanged(int)"><code>Player.Listener.onPlaybackStateChanged(int)</code></a> are equal to the provided playback states.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertPlayedPeriodIndices(java.lang.Integer...)">assertPlayedPeriodIndices</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;periodIndices)</code></th>
<td class="colLast">
<div class="block">Asserts that the indices of played periods is equal to the provided list of periods.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)">assertPositionDiscontinuityReasonsEqual</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;discontinuityReasons)</code></th>
<td class="colLast">
<div class="block">Asserts that the discontinuity reasons reported by <a href="../Player.Listener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"><code>Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)</code></a> are
 equal to the provided values.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertTimelineChangeReasonsEqual(java.lang.Integer...)">assertTimelineChangeReasonsEqual</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;reasons)</code></th>
<td class="colLast">
<div class="block">Asserts that the timeline change reasons reported by <a href="../Player.Listener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"><code>Player.Listener.onTimelineChanged(Timeline, int)</code></a> are equal to the provided timeline change
 reasons.</div>
</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertTimelinesSame(com.google.android.exoplayer2.Timeline...)">assertTimelinesSame</a></span>&#8203;(<a href="../Timeline.html" title="class in com.google.android.exoplayer2">Timeline</a>...&nbsp;timelines)</code></th>
<td class="colLast">
<div class="block">Asserts that the timelines reported by <a href="../Player.Listener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"><code>Player.Listener.onTimelineChanged(Timeline, int)</code></a>
 are the same to the provided timelines.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)">assertTrackGroupsEqual</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;trackGroupArray)</code></th>
<td class="colLast">
<div class="block">Asserts that the last track group array reported by <a href="../Player.Listener.html#onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"><code>Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)</code></a> is equal to the provided
 track group array.</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code><a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#blockUntilActionScheduleFinished(long)">blockUntilActionScheduleFinished</a></span>&#8203;(long&nbsp;timeoutMs)</code></th>
<td class="colLast">
<div class="block">Blocks the current thread until the action schedule finished.</div>
</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code><a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#blockUntilEnded(long)">blockUntilEnded</a></span>&#8203;(long&nbsp;timeoutMs)</code></th>
<td class="colLast">
<div class="block">Blocks the current thread until the test runner finishes.</div>
</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onActionScheduleFinished()">onActionScheduleFinished</a></span>()</code></th>
<td class="colLast">
<div class="block">Called when action schedule finished executing all its actions.</div>
</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)">onMediaItemTransition</a></span>&#8203;(<a href="../MediaItem.html" title="class in com.google.android.exoplayer2">MediaItem</a>&nbsp;mediaItem,
                     int&nbsp;reason)</code></th>
<td class="colLast">
<div class="block">Called when playback transitions to a media item or starts repeating a media item according
 to the current <a href="../Player.html#getRepeatMode()"><code>repeat mode</code></a>.</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onPlaybackStateChanged(int)">onPlaybackStateChanged</a></span>&#8203;(int&nbsp;playbackState)</code></th>
<td class="colLast">
<div class="block">Called when the value returned from <a href="../Player.html#getPlaybackState()"><code>Player.getPlaybackState()</code></a> changes.</div>
</td>
</tr>
<tr id="i14" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)">onPlayerError</a></span>&#8203;(<a href="../ExoPlaybackException.html" title="class in com.google.android.exoplayer2">ExoPlaybackException</a>&nbsp;error)</code></th>
<td class="colLast">
<div class="block">Called when an error occurs.</div>
</td>
</tr>
<tr id="i15" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)">onPositionDiscontinuity</a></span>&#8203;(<a href="../Player.PositionInfo.html" title="class in com.google.android.exoplayer2">Player.PositionInfo</a>&nbsp;oldPosition,
                       <a href="../Player.PositionInfo.html" title="class in com.google.android.exoplayer2">Player.PositionInfo</a>&nbsp;newPosition,
                       int&nbsp;reason)</code></th>
<td class="colLast">
<div class="block">Called when a position discontinuity occurs.</div>
</td>
</tr>
<tr id="i16" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)">onTimelineChanged</a></span>&#8203;(<a href="../Timeline.html" title="class in com.google.android.exoplayer2">Timeline</a>&nbsp;timeline,
                 int&nbsp;reason)</code></th>
<td class="colLast">
<div class="block">Called when the timeline has been refreshed.</div>
</td>
</tr>
<tr id="i17" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)">onTracksChanged</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;trackGroups,
               <a href="../trackselection/TrackSelectionArray.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionArray</a>&nbsp;trackSelections)</code></th>
<td class="colLast">
<div class="block">Called when the available or selected tracks change.</div>
</td>
</tr>
<tr id="i18" class="altColor">
<td class="colFirst"><code><a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#start()">start</a></span>()</code></th>
<td class="colLast">
<div class="block">Starts the test runner on its own thread.</div>
</td>
</tr>
<tr id="i19" class="rowColor">
<td class="colFirst"><code><a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#start(boolean)">start</a></span>&#8203;(boolean&nbsp;doPrepare)</code></th>
<td class="colLast">
<div class="block">Starts the test runner on its own thread.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!--   -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.<a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">Object</a></h3>
<code><a href="https://developer.android.com/reference/java/lang/Object.html#clone()" title="class or interface in java.lang" class="externalLink">clone</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang" class="externalLink">equals</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang" class="externalLink">finalize</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang" class="externalLink">getClass</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang" class="externalLink">hashCode</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang" class="externalLink">notify</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#notifyAll()" title="class or interface in java.lang" class="externalLink">notifyAll</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang" class="externalLink">toString</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang" class="externalLink">wait</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang" class="externalLink">wait</a>, <a href="https://developer.android.com/reference/java/lang/Object.html?is-external=true#wait(long,int)" title="class or interface in java.lang" class="externalLink" target="_top">wait</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.com.google.android.exoplayer2.Player.EventListener">
<!--   -->
</a>
<h3>Methods inherited from interface&nbsp;com.google.android.exoplayer2.<a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></h3>
<code><a href="../Player.EventListener.html#onLoadingChanged(boolean)">onLoadingChanged</a>, <a href="../Player.EventListener.html#onPlayerStateChanged(boolean,int)">onPlayerStateChanged</a>, <a href="../Player.EventListener.html#onPositionDiscontinuity(int)">onPositionDiscontinuity</a>, <a href="../Player.EventListener.html#onSeekProcessed()">onSeekProcessed</a>, <a href="../Player.EventListener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,java.lang.Object,int)">onTimelineChanged</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.com.google.android.exoplayer2.Player.Listener">
<!--   -->
</a>
<h3>Methods inherited from interface&nbsp;com.google.android.exoplayer2.<a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></h3>
<code><a href="../Player.Listener.html#onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)">onAudioAttributesChanged</a>, <a href="../Player.Listener.html#onAudioSessionIdChanged(int)">onAudioSessionIdChanged</a>, <a href="../Player.Listener.html#onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)">onAvailableCommandsChanged</a>, <a href="../Player.Listener.html#onCues(java.util.List)">onCues</a>, <a href="../Player.Listener.html#onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)">onDeviceInfoChanged</a>, <a href="../Player.Listener.html#onDeviceVolumeChanged(int,boolean)">onDeviceVolumeChanged</a>, <a href="../Player.Listener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)">onEvents</a>, <a href="../Player.Listener.html#onIsLoadingChanged(boolean)">onIsLoadingChanged</a>, <a href="../Player.Listener.html#onIsPlayingChanged(boolean)">onIsPlayingChanged</a>, <a href="../Player.Listener.html#onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)">onMediaMetadataChanged</a>, <a href="../Player.Listener.html#onMetadata(com.google.android.exoplayer2.metadata.Metadata)">onMetadata</a>, <a href="../Player.Listener.html#onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)">onPlaybackParametersChanged</a>, <a href="../Player.Listener.html#onPlaybackSuppressionReasonChanged(int)">onPlaybackSuppressionReasonChanged</a>, <a href="../Player.Listener.html#onPlayWhenReadyChanged(boolean,int)">onPlayWhenReadyChanged</a>, <a href="../Player.Listener.html#onRenderedFirstFrame()">onRenderedFirstFrame</a>, <a href="../Player.Listener.html#onRepeatModeChanged(int)">onRepeatModeChanged</a>, <a href="../Player.Listener.html#onShuffleModeEnabledChanged(boolean)">onShuffleModeEnabledChanged</a>, <a href="../Player.Listener.html#onSkipSilenceEnabledChanged(boolean)">onSkipSilenceEnabledChanged</a>, <a href="../Player.Listener.html#onStaticMetadataChanged(java.util.List)">onStaticMetadataChanged</a>, <a href="../Player.Listener.html#onSurfaceSizeChanged(int,int)">onSurfaceSizeChanged</a>, <a href="../Player.Listener.html#onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)">onVideoSizeChanged</a>, <a href="../Player.Listener.html#onVolumeChanged(float)">onVolumeChanged</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.com.google.android.exoplayer2.video.VideoListener">
<!--   -->
</a>
<h3>Methods inherited from interface&nbsp;com.google.android.exoplayer2.video.<a href="../video/VideoListener.html" title="interface in com.google.android.exoplayer2.video">VideoListener</a></h3>
<code><a href="../video/VideoListener.html#onVideoSizeChanged(int,int,int,float)">onVideoSizeChanged</a></code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ FIELD DETAIL =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="field.detail">
<!--   -->
</a>
<h3>Field Detail</h3>
<a id="VIDEO_FORMAT">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>VIDEO_FORMAT</h4>
<pre>public static final&nbsp;<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a> VIDEO_FORMAT</pre>
<div class="block">A generic video <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> which can be used to set up a <a href="FakeMediaSource.html" title="class in com.google.android.exoplayer2.testutil"><code>FakeMediaSource</code></a>.</div>
</li>
</ul>
<a id="AUDIO_FORMAT">
<!--   -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>AUDIO_FORMAT</h4>
<pre>public static final&nbsp;<a href="../Format.html" title="class in com.google.android.exoplayer2">Format</a> AUDIO_FORMAT</pre>
<div class="block">A generic audio <a href="../Format.html" title="class in com.google.android.exoplayer2"><code>Format</code></a> which can be used to set up a <a href="FakeMediaSource.html" title="class in com.google.android.exoplayer2.testutil"><code>FakeMediaSource</code></a>.</div>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!--   -->
</a>
<h3>Method Detail</h3>
<a id="start()">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>start</h4>
<pre class="methodSignature">public&nbsp;<a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a>&nbsp;start()</pre>
<div class="block">Starts the test runner on its own thread. This will trigger the creation of the player, the
 listener registration, the start of the action schedule, the initial set of media items and the
 preparation of the player.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>This test runner.</dd>
</dl>
</li>
</ul>
<a id="start(boolean)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>start</h4>
<pre class="methodSignature">public&nbsp;<a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a>&nbsp;start&#8203;(boolean&nbsp;doPrepare)</pre>
<div class="block">Starts the test runner on its own thread. This will trigger the creation of the player, the
 listener registration, the start of the action schedule and the initial set of media items.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>doPrepare</code> - Whether the player should be prepared.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>This test runner.</dd>
</dl>
</li>
</ul>
<a id="blockUntilEnded(long)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>blockUntilEnded</h4>
<pre class="methodSignature">public&nbsp;<a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a>&nbsp;blockUntilEnded&#8203;(long&nbsp;timeoutMs)
                                    throws <a href="https://developer.android.com/reference/java/lang/Exception.html" title="class or interface in java.lang" class="externalLink" target="_top">Exception</a></pre>
<div class="block">Blocks the current thread until the test runner finishes. A test is deemed to be finished when
 the playback state transitioned to <a href="../Player.html#STATE_ENDED"><code>Player.STATE_ENDED</code></a> or <a href="../Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a> for
 the specified number of times. The test also finishes when an <a href="../ExoPlaybackException.html" title="class in com.google.android.exoplayer2"><code>ExoPlaybackException</code></a> is
 thrown.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeoutMs</code> - The maximum time to wait for the test runner to finish. If this time elapsed
     the method will throw a <a href="https://developer.android.com/reference/java/util/concurrent/TimeoutException.html" title="class or interface in java.util.concurrent" class="externalLink" target="_top"><code>TimeoutException</code></a>.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>This test runner.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="https://developer.android.com/reference/java/lang/Exception.html" title="class or interface in java.lang" class="externalLink" target="_top">Exception</a></code> - If any exception occurred during playback, release, or due to a timeout.</dd>
</dl>
</li>
</ul>
<a id="blockUntilActionScheduleFinished(long)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>blockUntilActionScheduleFinished</h4>
<pre class="methodSignature">public&nbsp;<a href="ExoPlayerTestRunner.html" title="class in com.google.android.exoplayer2.testutil">ExoPlayerTestRunner</a>&nbsp;blockUntilActionScheduleFinished&#8203;(long&nbsp;timeoutMs)
                                                     throws <a href="https://developer.android.com/reference/java/util/concurrent/TimeoutException.html" title="class or interface in java.util.concurrent" class="externalLink" target="_top">TimeoutException</a>,
                                                            <a href="https://developer.android.com/reference/java/lang/InterruptedException.html" title="class or interface in java.lang" class="externalLink" target="_top">InterruptedException</a></pre>
<div class="block">Blocks the current thread until the action schedule finished. This does not release the test
 runner and the test must still call <a href="#blockUntilEnded(long)"><code>blockUntilEnded(long)</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeoutMs</code> - The maximum time to wait for the action schedule to finish.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>This test runner.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="https://developer.android.com/reference/java/util/concurrent/TimeoutException.html" title="class or interface in java.util.concurrent" class="externalLink" target="_top">TimeoutException</a></code> - If the action schedule did not finish within the specified timeout.</dd>
<dd><code><a href="https://developer.android.com/reference/java/lang/InterruptedException.html" title="class or interface in java.lang" class="externalLink" target="_top">InterruptedException</a></code> - If the test thread gets interrupted while waiting.</dd>
</dl>
</li>
</ul>
<a id="assertTimelinesSame(com.google.android.exoplayer2.Timeline...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertTimelinesSame</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertTimelinesSame&#8203;(<a href="../Timeline.html" title="class in com.google.android.exoplayer2">Timeline</a>...&nbsp;timelines)</pre>
<div class="block">Asserts that the timelines reported by <a href="../Player.Listener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"><code>Player.Listener.onTimelineChanged(Timeline, int)</code></a>
 are the same to the provided timelines. This assert differs from testing equality by not
 comparing period ids which may be different due to id mapping of child source period ids.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timelines</code> - A list of expected <a href="../Timeline.html" title="class in com.google.android.exoplayer2"><code>Timeline</code></a>s.</dd>
</dl>
</li>
</ul>
<a id="assertTimelineChangeReasonsEqual(java.lang.Integer...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertTimelineChangeReasonsEqual</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertTimelineChangeReasonsEqual&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;reasons)</pre>
<div class="block">Asserts that the timeline change reasons reported by <a href="../Player.Listener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"><code>Player.Listener.onTimelineChanged(Timeline, int)</code></a> are equal to the provided timeline change
 reasons.</div>
</li>
</ul>
<a id="assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertMediaItemsTransitionedSame</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertMediaItemsTransitionedSame&#8203;(<a href="../MediaItem.html" title="class in com.google.android.exoplayer2">MediaItem</a>...&nbsp;mediaItems)</pre>
<div class="block">Asserts that the media items reported by <a href="../Player.Listener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"><code>Player.Listener.onMediaItemTransition(MediaItem, int)</code></a> are the same as the provided media
 items.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>mediaItems</code> - A list of expected <a href="../MediaItem.html" title="class in com.google.android.exoplayer2"><code>media items</code></a>.</dd>
</dl>
</li>
</ul>
<a id="assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertMediaItemsTransitionReasonsEqual</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertMediaItemsTransitionReasonsEqual&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;reasons)</pre>
<div class="block">Asserts that the media item transition reasons reported by <a href="../Player.Listener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"><code>Player.Listener.onMediaItemTransition(MediaItem, int)</code></a> are the same as the provided reasons.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>reasons</code> - A list of expected transition reasons.</dd>
</dl>
</li>
</ul>
<a id="assertPlaybackStatesEqual(java.lang.Integer...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertPlaybackStatesEqual</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertPlaybackStatesEqual&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;states)</pre>
<div class="block">Asserts that the playback states reported by <a href="../Player.Listener.html#onPlaybackStateChanged(int)"><code>Player.Listener.onPlaybackStateChanged(int)</code></a> are equal to the provided playback states.</div>
</li>
</ul>
<a id="assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertTrackGroupsEqual</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertTrackGroupsEqual&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;trackGroupArray)</pre>
<div class="block">Asserts that the last track group array reported by <a href="../Player.Listener.html#onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"><code>Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)</code></a> is equal to the provided
 track group array.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>trackGroupArray</code> - The expected <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</dd>
</dl>
</li>
</ul>
<a id="assertNoPositionDiscontinuities()">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertNoPositionDiscontinuities</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertNoPositionDiscontinuities()</pre>
<div class="block">Asserts that <a href="../Player.Listener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"><code>Player.Listener.onPositionDiscontinuity(Player.PositionInfo,
 Player.PositionInfo, int)</code></a> was not called.</div>
</li>
</ul>
<a id="assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertPositionDiscontinuityReasonsEqual</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertPositionDiscontinuityReasonsEqual&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;discontinuityReasons)</pre>
<div class="block">Asserts that the discontinuity reasons reported by <a href="../Player.Listener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"><code>Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)</code></a> are
 equal to the provided values.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>discontinuityReasons</code> - The expected discontinuity reasons.</dd>
</dl>
</li>
</ul>
<a id="assertPlayedPeriodIndices(java.lang.Integer...)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>assertPlayedPeriodIndices</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;assertPlayedPeriodIndices&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>...&nbsp;periodIndices)</pre>
<div class="block">Asserts that the indices of played periods is equal to the provided list of periods. A period
 is considered to be played if it was the current period after a position discontinuity or a
 media source preparation. When the same period is repeated automatically due to enabled repeat
 modes, it is reported twice. Seeks within the current period are not reported.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>periodIndices</code> - A list of expected period indices.</dd>
</dl>
</li>
</ul>
<a id="onTimelineChanged(com.google.android.exoplayer2.Timeline,int)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onTimelineChanged</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onTimelineChanged&#8203;(<a href="../Timeline.html" title="class in com.google.android.exoplayer2">Timeline</a>&nbsp;timeline,
                              <a href="../Player.TimelineChangeReason.html" title="annotation in com.google.android.exoplayer2">@TimelineChangeReason</a>
                              int&nbsp;reason)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.EventListener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)">Player.EventListener</a></code></span></div>
<div class="block">Called when the timeline has been refreshed.

 <p>Note that the current window or period index may change as a result of a timeline change.
 If playback can't continue smoothly because of this timeline change, a separate <a href="../Player.EventListener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"><code>Player.EventListener.onPositionDiscontinuity(PositionInfo, PositionInfo, int)</code></a> callback will be triggered.

 <p><a href="../Player.EventListener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"><code>Player.EventListener.onEvents(Player, Events)</code></a> will also be called to report this event along with
 other events that happen in the same <a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top"><code>Looper</code></a> message queue iteration.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.EventListener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)">onTimelineChanged</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.Listener.html#onTimelineChanged(com.google.android.exoplayer2.Timeline,int)">onTimelineChanged</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>timeline</code> - The latest timeline. Never null, but may be empty.</dd>
<dd><code>reason</code> - The <a href="../Player.TimelineChangeReason.html" title="annotation in com.google.android.exoplayer2"><code>Player.TimelineChangeReason</code></a> responsible for this timeline change.</dd>
</dl>
</li>
</ul>
<a id="onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onMediaItemTransition</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onMediaItemTransition&#8203;(@Nullable
                                  <a href="../MediaItem.html" title="class in com.google.android.exoplayer2">MediaItem</a>&nbsp;mediaItem,
                                  <a href="../Player.MediaItemTransitionReason.html" title="annotation in com.google.android.exoplayer2">@MediaItemTransitionReason</a>
                                  int&nbsp;reason)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.EventListener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)">Player.EventListener</a></code></span></div>
<div class="block">Called when playback transitions to a media item or starts repeating a media item according
 to the current <a href="../Player.html#getRepeatMode()"><code>repeat mode</code></a>.

 <p>Note that this callback is also called when the playlist becomes non-empty or empty as a
 consequence of a playlist change.

 <p><a href="../Player.EventListener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"><code>Player.EventListener.onEvents(Player, Events)</code></a> will also be called to report this event along with
 other events that happen in the same <a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top"><code>Looper</code></a> message queue iteration.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.EventListener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)">onMediaItemTransition</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.Listener.html#onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)">onMediaItemTransition</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>mediaItem</code> - The <a href="../MediaItem.html" title="class in com.google.android.exoplayer2"><code>MediaItem</code></a>. May be null if the playlist becomes empty.</dd>
<dd><code>reason</code> - The reason for the transition.</dd>
</dl>
</li>
</ul>
<a id="onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onTracksChanged</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onTracksChanged&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;trackGroups,
                            <a href="../trackselection/TrackSelectionArray.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionArray</a>&nbsp;trackSelections)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.EventListener.html#onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)">Player.EventListener</a></code></span></div>
<div class="block">Called when the available or selected tracks change.

 <p><a href="../Player.EventListener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"><code>Player.EventListener.onEvents(Player, Events)</code></a> will also be called to report this event along with
 other events that happen in the same <a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top"><code>Looper</code></a> message queue iteration.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.EventListener.html#onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)">onTracksChanged</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.Listener.html#onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)">onTracksChanged</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>trackGroups</code> - The available tracks. Never null, but may be of length zero.</dd>
<dd><code>trackSelections</code> - The selected tracks. Never null, but may contain null elements. A
     concrete implementation may include null elements if it has a fixed number of renderer
     components, wishes to report a TrackSelection for each of them, and has one or more
     renderer components that is not assigned any selected tracks.</dd>
</dl>
</li>
</ul>
<a id="onPlaybackStateChanged(int)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onPlaybackStateChanged</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onPlaybackStateChanged&#8203;(<a href="../Player.State.html" title="annotation in com.google.android.exoplayer2">@State</a>
                                   int&nbsp;playbackState)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.EventListener.html#onPlaybackStateChanged(int)">Player.EventListener</a></code></span></div>
<div class="block">Called when the value returned from <a href="../Player.html#getPlaybackState()"><code>Player.getPlaybackState()</code></a> changes.

 <p><a href="../Player.EventListener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"><code>Player.EventListener.onEvents(Player, Events)</code></a> will also be called to report this event along with
 other events that happen in the same <a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top"><code>Looper</code></a> message queue iteration.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.EventListener.html#onPlaybackStateChanged(int)">onPlaybackStateChanged</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.Listener.html#onPlaybackStateChanged(int)">onPlaybackStateChanged</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>playbackState</code> - The new playback <a href="../Player.State.html" title="annotation in com.google.android.exoplayer2"><code>state</code></a>.</dd>
</dl>
</li>
</ul>
<a id="onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onPlayerError</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onPlayerError&#8203;(<a href="../ExoPlaybackException.html" title="class in com.google.android.exoplayer2">ExoPlaybackException</a>&nbsp;error)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.EventListener.html#onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)">Player.EventListener</a></code></span></div>
<div class="block">Called when an error occurs. The playback state will transition to <a href="../Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a>
 immediately after this method is called. The player instance can still be used, and <a href="../Player.html#release()"><code>Player.release()</code></a> must still be called on the player should it no longer be required.

 <p><a href="../Player.EventListener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"><code>Player.EventListener.onEvents(Player, Events)</code></a> will also be called to report this event along with
 other events that happen in the same <a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top"><code>Looper</code></a> message queue iteration.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.EventListener.html#onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)">onPlayerError</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.Listener.html#onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)">onPlayerError</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>error</code> - The error.</dd>
</dl>
</li>
</ul>
<a id="onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)">
<!--   -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onPositionDiscontinuity</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onPositionDiscontinuity&#8203;(<a href="../Player.PositionInfo.html" title="class in com.google.android.exoplayer2">Player.PositionInfo</a>&nbsp;oldPosition,
                                    <a href="../Player.PositionInfo.html" title="class in com.google.android.exoplayer2">Player.PositionInfo</a>&nbsp;newPosition,
                                    <a href="../Player.DiscontinuityReason.html" title="annotation in com.google.android.exoplayer2">@DiscontinuityReason</a>
                                    int&nbsp;reason)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.EventListener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)">Player.EventListener</a></code></span></div>
<div class="block">Called when a position discontinuity occurs.

 <p>A position discontinuity occurs when the playing period changes, the playback position
 jumps within the period currently being played, or when the playing period has been skipped
 or removed.

 <p><a href="../Player.EventListener.html#onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"><code>Player.EventListener.onEvents(Player, Events)</code></a> will also be called to report this event along with
 other events that happen in the same <a href="https://developer.android.com/reference/android/os/Looper.html" title="class or interface in android.os" class="externalLink" target="_top"><code>Looper</code></a> message queue iteration.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.EventListener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)">onPositionDiscontinuity</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.EventListener.html" title="interface in com.google.android.exoplayer2">Player.EventListener</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Player.Listener.html#onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)">onPositionDiscontinuity</a></code>&nbsp;in interface&nbsp;<code><a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2">Player.Listener</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>oldPosition</code> - The position before the discontinuity.</dd>
<dd><code>newPosition</code> - The position after the discontinuity.</dd>
<dd><code>reason</code> - The <a href="../Player.DiscontinuityReason.html" title="annotation in com.google.android.exoplayer2"><code>Player.DiscontinuityReason</code></a> responsible for the discontinuity.</dd>
</dl>
</li>
</ul>
<a id="onActionScheduleFinished()">
<!--   -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>onActionScheduleFinished</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;onActionScheduleFinished()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="ActionSchedule.Callback.html#onActionScheduleFinished()">ActionSchedule.Callback</a></code></span></div>
<div class="block">Called when action schedule finished executing all its actions.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="ActionSchedule.Callback.html#onActionScheduleFinished()">onActionScheduleFinished</a></code>&nbsp;in interface&nbsp;<code><a href="ActionSchedule.Callback.html" title="interface in com.google.android.exoplayer2.testutil">ActionSchedule.Callback</a></code></dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!--   -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!--   -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
  allClassesLink = document.getElementById("allclasses_navbar_bottom");
  if(window==top) {
    allClassesLink.style.display = "block";
  }
  else {
    allClassesLink.style.display = "none";
  }
  //-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!--   -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
</footer>
</body>
</html>
